/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.ipartek.formacion.gestformwww.modelo.beans;

import com.ipartek.formacion.gestformwww.controlador.Verificador;
import com.ipartek.formacion.gestformwww.modelo.beans.excepciones.GestorFormacionExcepcion;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Esta clase se encarga de filtrar los candidatos por nombre, apellidos, dni y/o fecha de entrevista
 * @author Ekaitz y Eneko
 */
public class FiltroCandidato {
    ResourceBundle bundle;
    private int canId;
    private String canNIF;
    private String nom;
    private String ape1;
    private String ape2;
    private String tlf1;
    private String tlf2;
    private int estId;
    private String orden;
    private String fechEntrevista;
    private String columnaFiltrar;
    private boolean noConvocatoria;
    private boolean activo;
    private String fechUltimoCont;
    private int convId;
    private int pagsiguiente;
    private int elementospag;
    private int actId;
    private int conId;

    /**
     * Inicializa un nuevo objeto FiltroCandidato
     * @param bundle ResourceBundle que recoge el mapeo de la accion numRegPagCandidatos
     */
    public FiltroCandidato(ResourceBundle bundle) {
        this.noConvocatoria=false;
        this.pagsiguiente=1;
        try {
            this.elementospag=Integer.parseInt(bundle.getString("numRegPagCandidatos"));
        } catch (RuntimeException e){
            throw new RuntimeException(bundle.getString("no-paginas"));
        }
        this.bundle=bundle;        
    }
    /**
     * Inicializa un nuevo objeto FIltroCandidato con los parametros correspondientes
     * @param bundle ResourceBundle que recoge el mapeo de la accion numRegPagCandidatos
     * @param canId int con el identificador del candidato.
     * @param canNIF String con el DNI del candidato.
     * @param nom String con el nombre del candidato.
     * @param ape1 String con el primer apellido del candidato.
     * @param ape2 String con el segundo apellido del candidato.
     * @param estId int con el identificador de estado del candidato.
     * @param orden String con la descripcion del ordenamiento (ascendente / descendente)
     * @param fechEntrevista Timestamp con la fecha de la primera entrevista.
     * @param columnaFiltrar String con el nombre de la columna a filtrar.
     * @param fechUltimoCont Timestamp con la fecha del ultimo contacto.
     * @param convId int con el identificativo de la convocatoria.
     */
    public FiltroCandidato(ResourceBundle bundle, int canId, String canNIF, String nom, String ape1, String ape2, String tlf1, String tlf2, int estId, String orden, String fechEntrevista, String columnaFiltrar, String fechUltimoCont, int convId) {
        this.bundle = bundle;
        this.canId = canId;
        this.canNIF = canNIF;
        this.nom = nom;
        this.ape1 = ape1;
        this.ape2 = ape2;
        this.tlf1 = tlf1;
        this.tlf2 = tlf2;
        this.estId = 0;
        this.orden = orden;
        this.fechEntrevista = fechEntrevista;
        this.columnaFiltrar = columnaFiltrar;
        this.noConvocatoria = false;
        this.activo = true;
        this.fechUltimoCont = fechUltimoCont;
        this.convId = convId;
        this.actId = 1;
    }
    /**
     * Devuelve el numero de elementos que se mostraran por pagina.
     * @return int
     */
    public Integer getElementospag() {
        return elementospag;
    }
    /**
     * Establece el numero de elementos que se mostraran pero pagina.
     * @param elementospag
     */
    public void setElementospag(String elementospag) {
        if(Verificador.numeroValido(elementospag)){
            this.elementospag = Integer.parseInt(elementospag);
        }
    }
    /**
     * Devuelve la siguiente pagina a mostrar.
     * @return int
     */
    public Integer getPagsiguiente() {
        return pagsiguiente;
    }
    /**
     * Establece la pagina siguiente.
     * @param pagsiguiente int
     */
    public void setPagsiguiente(String pagsiguiente) {
       if (Verificador.numeroValido(pagsiguiente)) {
            this.pagsiguiente = Integer.parseInt(pagsiguiente);
        } else {
            this.pagsiguiente = 1;
        }
    }
    /**
     * Devuelve el valor del filtro entre todos, activo e inactivo.
     * @return int
     */
    public int getActId() {
        return actId;
    }
    /**
     * Establece el valor del filtro entre todos, activo e inactivo.
     * @param actId int
     */
    public void setActId(String actId) {
        if (Verificador.caracteresCorrectos(actId)) {
            if (actId!= null) {
                this.actId = Integer.parseInt(actId);
            }
        } else {
            this.actId = 1;
        }
    }
    /**
     * Indica si el candidato esta activo o no.
     * @return boolean
     */
    public boolean isActivo() {
        return activo;
    }
    /**
     * Establece si el candidato esta activo o no.
     * @param activo boolean
     */
    public void setActivo(boolean activo) {
        this.activo = activo;
    }
    /**
     * Devuelve el primer apellido del candidato.
     * @return String
     */
    public String getApe1() {
        return ape1;
    }
    /**
     * Modifica el primer apellido del candidato.
     * @param ape1 String
     */
    public void setApe1(String ape1) {
        if (Verificador.caracteresCorrectos(ape1)) {
            if (ape1!= null) {
                this.ape1 = ape1;
            }
        } else {
            this.ape1 = null;
        }
    }
    /**
     * Devuelve el segundo apellido del candidato.
     * @return String
     */
    public String getApe2() {
        return ape2;
    }

    /**
     * Modifica el segundo apellido del candidato.
     * @param ape2 String
     */
    public void setApe2(String ape2) {
        if (Verificador.caracteresCorrectos(ape2)) {
            if (ape2 != null) {
                this.ape2 = ape2;
            }
        } else {
            this.ape2 = null;
        }
    }
    public String getTlf1() {
        return tlf1;
    }

    public void setTlf1(String tlf1) {
        if (Verificador.comprobarTelefono(tlf1)) {
            if (tlf1 != null) {
                this.tlf1 = tlf1;
            }
        } else {
            this.tlf1 = null;
        }
    }

    public String getTlf2() {
        return tlf2;
    }

    public void setTlf2(String tlf2) {
        if (Verificador.comprobarTelefono(tlf2)) {
            if (tlf2 != null) {
                this.tlf2 = tlf2;
            }
        } else {
            this.tlf2 = null;
        }
    }

    /**
     * Devuelve el ResourceBundle.
     * @return ResourceBundle
     */
    public ResourceBundle getBundle() {
        return bundle;
    }
    /**
     * Modifica el ResourceBundle.
     * @param bundle ResourceBundle
     */
    public void setBundle(ResourceBundle bundle) {
        this.bundle = bundle;
    }
    /**
     * Devuelve el identificativo del candidato.
     * @return int
     */
    public int getCanId() {
        return canId;
    }
    /**
     * Modifica el identicativo del candidato
     * @param canId int
     */
    public void setCanId(int canId) {
        this.canId = canId;
    }
    /**
     * Devuelve el DNI del candidato.
     * @return String
     */
    public String getCanNIF() {
        return canNIF;
    }
    /**
     * Establece el DNI del candidato.
     * @param canNIF String
     */
    public void setCanNIF(String canNIF) {
        if (Verificador.caracteresCorrectos(canNIF)) {
            if (canNIF!= null) {
                this.canNIF = canNIF;
            }
        } else {
            this.canNIF = null;
        }
    }
    /**
     * Devuelve el nombre de la columna a filtrar.
     * @return String
     */
    public String getColumnaFiltrar() {
        return columnaFiltrar;
    }
    /**
     * Modifica el nombre de la columna a filtrar.
     * @param columnaFiltrar String
     */
    public void setColumnaFiltrar(String columnaFiltrar) {
        this.columnaFiltrar = columnaFiltrar;
    }
    /**
     * Devuelve el identificativo de la convocatoria.
     * @return int
     */
    public int getConvId() {
        return convId;
    }
    /**
     * Modifica el identificativo de la convocatoria.
     * @param convId
     */
    public void setConvId(int convId) {
        this.convId = convId;
    }
    /**
     * Devuelve el identificativo de estado del candidato.
     * @return int
     */
    public int getEstId() {
        return estId;
    }
    /**
     * Modifica el identificativo de estado del candidato.
     * @param estId
     */
    public void setEstId(String estId) {
         if (Verificador.caracteresCorrectos(estId)) {
           
                this.estId = Integer.parseInt(estId);
         
        } else {
            if (estId!=null)
                this.estId = 0;
        }
    }
    /**
     * Devuelve la fecha en la que se realizo la primera entrevista.
     * @return Timestamp
     */
    public String getFechEntrevista() {
        return fechEntrevista;
    }
    /**
     * Modifica la fecha en la que se realizo la primera entrevista.
     * @param fechEntrevista Timestamp
     */
    public void setFechEntrevista(String fechEntrevista) {
        if (!Verificador.fechaValida(fechEntrevista)) {
            this.fechEntrevista = "";
       } else {
           if (fechEntrevista != null) {
               this.fechEntrevista = fechEntrevista;
           }
       }
    }
    /**
     * Devuelve la fecha en la que se mantuvo el ultimo contacto con el candidato
     * @return Timestamp
     */
    public String getFechUltimoCont() {
        return fechUltimoCont;
    }
    /**
     * Modifica la fecha en la que se mantuvo el ultimo contacto con el candidato
     * @param fechUltimoCont Timestamp
     */
    public void setFechUltimoCont(String fechUltimoCont) {
        if (!Verificador.fechaValida(fechUltimoCont)) {
            this.fechUltimoCont = "";
       } else {
           if (fechUltimoCont != null) {
               this.fechUltimoCont = fechUltimoCont;
           }
       }
    }
    /**
     * Devuelve si el candidato pertenece a alguna convocatoria o no.
     * @return boolean
     */
    public boolean isNoConvocatoria() {
        return noConvocatoria;
    }
    /**
     * Establece si el candidato pertenece a alguna convocatoria o no.
     * @param noConvocatoria boolean
     */
    public void setNoConvocatoria(boolean noConvocatoria) {
        this.noConvocatoria = noConvocatoria;
    }
    /**
     * Devuelve el nombre del candidato.
     * @return String
     */
    public String getNom() {
        return nom;
    }
    /**
     * Modifica el nombre del candidato.
     * @param nom String
     */
    public void setNom(String nom) {
        if (Verificador.caracteresCorrectos(nom)) {
            if (nom != null) {
                this.nom = nom;
            }
        } else {
            this.nom = null;
        }
    }
    /**
     * Devuelve el orden de listado (ascendente / descendente)
     * @return String
     */
    public String getOrden() {
        return orden;
    }
    /**
     * Establece el orden de listado (ascendente /descendente)
     * @param orden String
     */
    public void setOrden(String orden) {
        if (Verificador.caracteresCorrectos(orden)) {
            if (orden != null) {
                this.orden = orden;
            }
        } else {
            this.orden = null;
        }
    }
    /**
     * Devuelve la sentencia SQL.
     * @return String
     */
    public String getSQL() {
        String sql = "";
        String filtro = "ORDER BY candidato.canId";
        String and = "";
        String where = " WHERE ";
        if (columnaFiltrar != null && !columnaFiltrar.trim().equals("")) {
            String columna = bundle.getString(columnaFiltrar);
            if (columna != null && !columna.trim().equals("")) {
                filtro = "ORDER BY " + columna;
                if (orden != null && !orden.trim().equals("")) {
                    if (orden.trim().equals("ASC") || orden.trim().equals("DESC")) {
                        filtro = filtro + " " + orden;
                    }
                }
            }
        }

        if (convId <= 0){
            // Muestra todos los candidatos

                sql = "SELECT canId, canNIF, canNSS, canTlf1, canTlf2, canMail, canDir, canLocalidad, canFechNac, canNom, canApe1, canApe2, canObserv, empId, proId, canActivo FROM CANDIDATO";
             this.noConvocatoria = true;
        }else{
            if(noConvocatoria == false){

                // Muestra los candidatos de una convocatoria concreta informada en el filtro.
                sql = "SELECT candidato.canId, canNIF, canNSS, canTlf1, canTlf2, canMail, canDir, canLocalidad, canFechNac, canNom, canApe1, canApe2, canObserv, empId, proId, canActivo, estId, FechaEntrevista, FechaUltContacto FROM CANDIDATO LEFT JOIN candconv ON candidato.canId = candconv.canId WHERE candconv.conId=" + convId;
            }else{
                  // Muestra los candidatos que no están en la convocatoria concreta informada en el filtro.
                sql = "SELECT candidato.canId, canNIF, canNSS, canTlf1, canTlf2, canMail, canDir, "
                        + "canLocalidad, canFechNac, canNom, canApe1, canApe2, canObserv, empId, "
                        + "proId, canActivo, estId = null, FechaEntrevista = null, FechaUltContacto = null "
                        + "FROM candidato "
                        + "WHERE candidato.canId not in("
                        + "SELECT candidato.canId FROM candidato INNER JOIN candconv ON candidato.canId = candconv.canId "
                        + "WHERE candconv.conId = " + convId +") ";
                                    }
            and = " AND ";
            where = "";

        }

        if (actId == 2) {
            sql = sql + where + and + "candidato.canActivo = 1";
            where = "";
            and = " AND ";
        }
        if (actId == 3) {
            sql = sql + where+ and + "candidato.canActivo = 0";
            and = " AND ";
            where = "";
            }
        if (nom!=null && !nom.trim().isEmpty()){
            sql = sql + where + and + "candidato.canNom LIKE '%" + nom + "%'";
            and = " AND ";
            where = "";
        }
        if ((ape1 != null && !ape1.trim().isEmpty()) || (ape2 != null && !ape2.trim().isEmpty())){
            sql = sql + where + and + "candidato.canApe1 LIKE '%" + ape1 + "%' OR candidato.canApe2 LIKE '%" + ape1 + "%'";
            and = " AND ";
            where = "";
        }        
        if (canNIF != null && !canNIF.trim().isEmpty()){
            sql = sql + where + and + "candidato.canNIF =" + "'"+ canNIF + "'";
            and = " AND ";
            where = "";
        }
        if (fechEntrevista != null && !fechEntrevista.trim().isEmpty()) {
            sql = sql + where + and + "FechaEntrevista=" + fechEntrevista;
            and = " AND ";
            where = "";
        }
        if (estId >= 1 && estId <= 6) {
            sql = sql + where + and + "estId=" + estId;
//        }else {// si no tiene estId es que esta puesta la opcion todos asi que se
//            //  muestran todos los candidatos independientemente de su estado
//            sql = sql + where + and + "estId BETWEEN '1' AND '6'";
        }
        if ((tlf1 != null && !tlf1.trim().isEmpty()) || (tlf2 != null && !tlf2.trim().isEmpty())){
            sql = sql + where + and + "candidato.Tlf1 LIKE '%" + tlf1 + "%' OR candidato.Tlf2 LIKE '%" + tlf1 + "%'";
            and = " AND ";
            where = "";
        }
        sql = sql + " " + filtro;
        return sql;
    }
    /**
     * Devuelve el primer elemento para la paginacion.
     * @return int
     */
    public int getPrimerElemento (){
        int primerelemento = (this.getPagsiguiente() - 1) * this.getElementospag() + 1;
        return primerelemento;
    }
    /**
     * Obtiene el último elemento para la paginación.
     * @return int
     */
    public int getUltimoElemento (){
        int ultimoelemento = this.getPagsiguiente() * this.getElementospag();
        return ultimoelemento;
    }

    /**
     * Establece el numero de elementos por pagina
     * @param elementospag Un entero
     */
    public void setElementospag(int elementospag) {
        this.elementospag = elementospag;
    }

    /**
     * Establece la pagina siguiente
     * @param pagsiguiente
     */
    public void setPagsiguiente(int pagsiguiente) {
        this.pagsiguiente = pagsiguiente;
    }
}
